import Sprite from '../../../js/base/sprite'
import Map from '../../../js/base/map'
import {databus} from '../../../js/databus'
// //打印信息到控制台、log中
// //例：mjl_log("This is log");
// //mjl_log("日志");
// [register]
// void mjl_log(char* msg);

// enum TURN_TYPE
// {
// 	TURN_FRONT,
// 	TURN_LEFT,
// 	TURN_RIGHT,
// 	TURN_BACK,
// };
// enum TRIGGER_TYPE
// {
// 	TRIGGER_NONE,
// 	TRIGGER_PHY,
// 	TRIGGER_PHY_SCRIPT,
// 	TRIGGER_MAX
// };
// enum HERO_DRESS_ITEM
// {
// 	HERO_DRESS_zhuang_shi_1,//装饰1
// 	HERO_DRESS_zhuang_shi_2,//装饰2
// 	HERO_DRESS_hu_wan,//护腕
// 	HERO_DRESS_xie_zi,//脚蹬
// 	HERO_DRESS_wu_qi,//手持
// 	HERO_DRESS_yi_fu,//身穿
// 	HERO_DRESS_hu_jia,//肩披
// 	HERO_DRESS_tou_dai,//头戴，比如发带
// 	HERO_DRESS_MAX
// };

// //将int转为字符串
// [register]
// char* mjl_int2Str(int v);

// //将float转为字符串
// [register]
// char* mjl_flt2Str(float v);

// //融合两个字符串为一个
// [register]
// char* mjl_mergeStr(char* a, char* b);
// //比较2个字符串，如果相同，则返回true，否则返回false
// //例如：
// //	if (mjl_matchStr(mjl_getMainHero(), "liu_qing_feng"))
// //	{
// //		mjl_msg("OK", 1.2f);
// //	}
// //	else
// //	{
// //		mjl_msg("NO", 1.2f);
// //	}
// [register]
// bool mjl_matchStr(char* a, char* b);

// //幂函数
// [register]
// float mjl_pow(float v, int power);


// //获取当前地图名字，比如“三清宫”
// //可以进行字符串比较，如
// //if (mjl_matchStr(mjl_getCurrentMapName(),"百草地"))
// //{
// 	//mjl_log("HIT");
// //}
// [register]
// char* mjl_getCurrentMapName();

// //获取当前地图内部名称，比如“sqg_bai_cao_di_0”
// [register]
// char* mjl_getCurrentMapNameGame();

// //获取当前主要角色[就是你操控的、显示在地图上的角色]的名字，可以修改的，修改后，角色形象也会变，下面有函数可以操作
// [register]
function mjl_getMainHero(){
  
  // console.log('mjl_getMainHero'+databus.hero)
  return databus.hero
}

// //获得角色形象所用的NPC名字，NPC位于anim/npc/目录下
// //hero_name:角色名字，如:liu_qing_feng
// [register]
function mjl_getHeroNpc(hero_name){
  const npc = databus.npcs.find(npc => npc[0].spriteName === hero_name)
  // console.log(npc)
  return npc;
}

// //设置角色形象所用的NPC名字，NPC位于anim/npc/目录下
// //hero_name:角色名字，如:liu_qing_feng
// //例如:mjl_setHeroNpc("liu_qing_feng", "da_shi_xiong");变为大师兄NPC形象
// [register]
// bool mjl_setHeroNpc(char* hero_name, char* npc_name);

// //获得主角战斗形象
// //hero_name:角色名字，如:liu_qing_feng
// [register]
// char* mjl_getHeroFighter(char* hero_name);

// //设置主角战斗形象
// //例如:mjl_setHeroFighter("liu_qing_feng", "da_shi_xiong");变为大师兄战斗形象
// [register]
// bool mjl_setHeroFighter(char* hero_name, char* fighter_name);

// //获取特定角色的等级
// [register]
// int mjl_getHeroLevel(char* hero_name);

// //设置特定角色的等级
// [register]
// void mjl_setHeroLevel(char* hero_name, int level);

// //获取特定角色的当前经验上限
// [register]
// int mjl_getHeroExpLimit(char* hero_name);

// //设置特定角色的当前经验上限
// [register]
// void mjl_setHeroExpLimit(char* hero_name, int exp);

// //获取特定角色的当前经验
// [register]
// int mjl_getHeroExp(char* hero_name);

// //设置特定角色的当前经验
// [register]
// void mjl_setHeroExp(char* hero_name, int exp);

// //增加指定角色的经验
// void mjl_addHeroExp(char* hero_name, int exp)
// { 
// 	int cur = mjl_getHeroExp(hero_name);
// 	mjl_setHeroExp(hero_name, exp + cur);
// }
// //获取特定角色的当前血量上限
// [register]
// int mjl_getHeroHPLimit(char* hero_name);

// //设置特定角色的当前血量上限
// [register]
// void mjl_setHeroHPLimit(char* hero_name, int v);

// //获取特定角色的当前法力上限
// [register]
// int mjl_getHeroMPLimit(char* hero_name);

// //设置特定角色的当前法力上限
// [register]
// void mjl_setHeroMPLimit(char* hero_name, int v);

// //获取特定角色的当前血量
// [register]
// int mjl_getHeroHP(char* hero_name);

// //设置特定角色的当前血量
// [register]
// void mjl_setHeroHP(char* hero_name, int v);

// //获取特定角色的当前法力
// [register]
// int mjl_getHeroMP(char* hero_name);

// //设置特定角色的当前法力
// [register]
// void mjl_setHeroMP(char* hero_name, int v);

// //获取特定角色的当前攻击力
// [register]
// int mjl_getHeroAtk(char* hero_name);

// //设置特定角色的当前攻击力
// [register]
// void mjl_setHeroAtk(char* hero_name, int v);

// //获取特定角色的当前防御
// [register]
// int mjl_getHeroDfd(char* hero_name);

// //设置特定角色的当前防御
// [register]
// void mjl_setHeroDfd(char* hero_name, int v);

// //获取特定角色的当前身法
// [register]
// int mjl_getHeroBody(char* hero_name);

// //设置特定角色的当前身法
// [register]
// void mjl_setHeroBody(char* hero_name, int v);

// //获取特定角色的当前灵力
// [register]
// int mjl_getHeroMana(char* hero_name);

// //设置特定角色的当前灵力
// [register]
// void mjl_setHeroMana(char* hero_name, int v);

// //获取特定角色的当前吉运
// [register]
// int mjl_getHeroLuck(char* hero_name);

// //设置特定角色的当前吉运
// [register]
// void mjl_setHeroLuck(char* hero_name, int v);

// //为主角提高hp、mp上限
// [register]
// void mjl_addHpMpLimit(char* hero_name, int hp, int mp);

// //提高攻击上限，如：mjl_addAtkLimit("liu_qing_feng", 1000);
// [register]
// void mjl_addAtkLimit(char* hero_name, int v);

// //提高防御上限，如：mjl_addDfdLimit("liu_qing_feng", 1000);
// [register]
// void mjl_addDfdLimit(char* hero_name, int v);

// //提高身法上限，如：mjl_addBodyLimit("liu_qing_feng", 1000);
// [register]
// void mjl_addBodyLimit(char* hero_name, int v);

// //提高吉运上限，如：mjl_addLuckLimit("liu_qing_feng", 1000);
// [register]
// void mjl_addLuckLimit(char* hero_name, int v);

// //提高灵力上限，如：mjl_addManaLimit("liu_qing_feng", 1000);
// [register]
// void mjl_addManaLimit(char* hero_name, int v);

// //获取特定角色的当前经验上限，佩戴装备后的数值
// [register]
// int mjl_getHeroExpLimitWithEquipment(char* hero_name);

// //获取特定角色的当前经验，佩戴装备后的数值
// [register]
// int mjl_getHeroExpWithEquipment(char* hero_name);

// //获取特定角色的当前血量上限，佩戴装备后的数值
// [register]
// int mjl_getHeroHPLimitWithEquipment(char* hero_name);

// //获取特定角色的当前法力上限，佩戴装备后的数值
// [register]
// int mjl_getHeroMPLimitWithEquipment(char* hero_name);

// //获取特定角色的当前血量，佩戴装备后的数值
// [register]
// int mjl_getHeroHPWithEquipment(char* hero_name);

// //获取特定角色的当前法力，佩戴装备后的数值
// [register]
// int mjl_getHeroMPWithEquipment(char* hero_name);

// //获取特定角色的当前攻击力，佩戴装备后的数值
// [register]
// int mjl_getHeroAtkWithEquipment(char* hero_name);

// //获取特定角色的当前防御，佩戴装备后的数值
// [register]
// int mjl_getHeroDfdWithEquipment(char* hero_name);

// //获取特定角色的当前身法，佩戴装备后的数值
// [register]
// int mjl_getHeroBodyWithEquipment(char* hero_name);

// //获取特定角色的当前灵力，佩戴装备后的数值
// [register]
// int mjl_getHeroManaWithEquipment(char* hero_name);

// //获取特定角色的当前吉运，佩戴装备后的数值
// [register]
// int mjl_getHeroLuckWithEquipment(char* hero_name);


// //清空背包中所有物品
// [register]
// void mjl_clearAllBagItems();

// //获取当前存档的运行时间，单位：秒
// [register]
// float mjl_getTime();

// //加载游戏地图，比如mjl_loadMap("map/sqg_bai_cao_di/0.map");加载百草地地图
// [register]
async function mjl_loadMap(path){
  // 地图加载时先清空npc
  databus.npcs = []
  const mapName = path.replace('/0.map','').replace('map/','')
  // console.log('images/resource/'+path.replace('/0.map',''))
  const worldMap = new Map('images/resource/'+path.replace('/0.map',''),0,0,0,0,0,0,0,0,mapName)
  const found = databus.mapConverts.some(item => item===mapName);
  await worldMap.readResource(!found)
  // console.log(databus.worldMap.map)
  if(!found)databus.mapConverts.push(mapName)
  worldMap.runMapScript()
  databus.worldMap = worldMap
}

// //加载一个npc到地图上，例：mjl_loadNpc("you_ren_1", "t1", true, "map/san_qing_gong/npc_1.c");
// //you_ren_1：NPC角色，位于anim\npc下，自己查看
// //t1：给这个NPC起个名字，用于操作NPC，比如为其设置位置mjl_setPos("t1", "pos_0");
// //true：是否可以自由行走，true表示可以，false表示原地不动
// //"map/san_qing_gong/npc_1.c"：为NPC添加脚本，与NPC对话触发此脚本
// [register]
function mjl_loadNpc(dir, name, bWalk, script){
  return new Promise(resolve => {  
    setTimeout(() => {  
     // "tian_ji_dao_ren", "wu_ji", false, "map/sqg_wu_ji_ge/wu_ji.js"
    const npc = [new Sprite('images/resource/anim/npc/'+dir+'/0.png',0,0,0,0,1,2,0,0,name),script]
    databus.npcs.push(npc)
    resolve()
    }, 5);  
  });
  
}

// /*
// 	name:npc的名字
// 	TRIGGER_NONE:没有物理碰撞，也没有脚本触发
// 	TRIGGER_PHY：物理碰撞
// 	TRIGGER_PHY_SCRIPT：触发脚本且物理碰撞
// */
// [register]
// void mjl_setNpcTriggerType(char* name, TRIGGER_TYPE tp);

// //运行与map绑定的main.c脚本，每张地图目录都有main.c，与map绑定
// [register]
// void mjl_runMapScript();

// //运行一个脚本文件，例：mjl_runScript("map/sqg_bai_cao_di/anim.c");
// [register]
function mjl_runScript(scriptName){
  // console.log(scriptName)
  let runJs = require('../'+scriptName)
  runJs.main()
  // console.log(scriptName)
}

// //让主角或者NPC转向
// [register]
// void mjl_turn(char* name, TURN_TYPE d);

// //显示一个消息，如mjl_msg("获得：乌龙剑", 1.2f);
// //1.2f：表示显示时间持续1.2秒
// [register]
// void mjl_msg(char* msg, float t);

// //显示一个消息，消息为地图名字
// [register]
function mjl_msgMap(mapName){
  databus.pool.mapMsg = {msgType:'mapMsg',content:mapName}
  databus.msgBox.push(databus.pool.mapMsg)
  // 暂停1秒  
  setTimeout(() => {  
    const mapMsgIndex = databus.msgBox.findIndex(msg => msg.msgType === 'mapMsg');  
    if (mapMsgIndex !== -1) {  
      databus.msgBox.splice(mapMsgIndex, 1);  
    }
  }, 1000);
}

// //移动物品：主角、NPC、其他图片等，dx：水平位移，dy垂直位移
// [register]
// void mjl_moveBy(char* name, int dx, int dy);

// //滑动的移动一个物品到指定的位置，pos需要在编辑器中设定，是一个网格的名称，time：移动持续的时间
// //例:mjl_slideTo("liu_qing_feng", "pos_0",1.2f);
// [register]
// void mjl_slideTo(char* name, char* pos, float time);//time>0.4f


// //滑动的移动一个物品到指定的位置，dx：水平位移，dy垂直位移
// [register]
// void mjl_slideBy(char* name, int dx, int dy, float time);

// //随机移动角色到某个位置
// [register]
// void mjl_slideToRandom(char* name, float time);//time>0.4f

// //设置角色、NPC等到指定位置
// [register]
function mjl_setPos(hero, posID){
  return new Promise(resolve => {
    const tile = databus.worldMap.map.event_layer.tiles.find(tile => tile.i[4] === posID);
    if(hero.spriteName===undefined){
      hero=mjl_getHeroNpc(hero)
      // console.log(hero,tile)
      hero[0].tx = tile.i[0];
      hero[0].ty = tile.i[1];
    }else{
      hero.tx = tile.i[0] - 8;
      hero.ty = tile.i[1] - 4;
    }
    resolve()
  })
}

// //显示一张图片，例：mjl_showTex("tex/game/hu_die/1.png", "t1", "hd_0", 100);

// //"tex/game/hu_die/1.png"：图片路径
// //"t1"：给图片起名
// //"hd_0"：把图片放到地图上的"hd_0"位置
// //100：ZOrder很高，不会被其他物品遮挡
// //ZOrder<0，表示自动更新ZOrder
// [register]
function mjl_showTex(path,name, pos, ZOrder){
  return new Promise(resolve => {  
    setTimeout(() => {  
      const tile = databus.worldMap.map.event_layer.tiles.find(tile => tile.i[4] === pos);
      const tex = new Sprite('images/resource/'+path,0,0,0,0,1,1,tile.i[0],tile.i[1],name)
      
      databus.movies.push(tex)
      resolve();
      // 定义一个函数来执行 splice 操作  
      const performSplice = () => {  
        databus.movies.splice(0, 1);  
      };  
      
      // 在1秒后调用该函数  
      setTimeout(performSplice, 1000);  
    }, 500);  
  });
  
  
}

// //"tex/game/hu_die/1.png"：图片路径
// //"t1"：给图片起名
// //anchor_x，anchor_y：图片的锚点，[0,0]表示图片左下角，[0.5,0.5]表示图片中心为锚点
// //x，y：屏幕位置，[0,0]表示把图片放到屏幕左下角，[0.5,0.5]表示中心
// //任意按键，图片消失，继续运行脚本
// //例子：mjl_showTexOnScreen("tex/ui/qq_share.png","tt", 0.5f, 0.5f, 0.5f, 0.5f);
// [register]
// void mjl_showTexOnScreen(char* path, char* name, float anchor_x, float anchor_y, float x, float y);

// //销毁一个物品
// [register]
function mjl_destroy(name){
  return new Promise(resolve => {  
    // console.log(indexToRemove,databus.npcs)
    // 定义一个函数来执行 splice 操作  
    const performSplice = () => {  
      const indexToRemove = databus.npcs.findIndex(npc => npc[0].spriteName === name);
      if (indexToRemove !== -1) {
        databus.npcs.splice(indexToRemove, 1);
        console.log(databus.npcs)
        resolve()
      }
    };  
    // 在1秒后调用该函数  
    setTimeout(performSplice, 3000); 
  })
}

// //显示对话，name：必须是主角，否则直接空着，例:
// //mjl_say("liu_qing_feng", "小蝴蝶..")
// //mjl_say("","商人：道家圣地！");
// [register]
function mjl_say(hero, content){
  return new Promise(resolve => {  
    let sayMessages = databus.msgBox.filter(msg => msg.msgType === 'sayMsg'); 
    databus.pool.sayMsg = {msgType:'sayMsg',content:content,hero: hero.spriteName}
    databus.msgBox=sayMessages.slice(1);
    databus.msgBox.push(databus.pool.sayMsg)
    setTimeout(() => {  
      // console.log( content,Math.floor(content.length / 14))
      resolve();  
    }, 2000);  
  }); 
  
}

// //全屏显示文字，用法类似mjl_say， font_sz表示字体大小
// [register]
// void mjl_say_board(char* content, int font_sz);

// //用于npc对话，mjl_say_npc("商人", "道家圣地！");
// [register]
// void mjl_say_npc(char* name, char* str);

// //冰冻住操作的角色，无法移动，v：true表示冰冻，false表示解冻
// [register]
// void mjl_freeze(bool v);

// //暂停脚本一段时间,mjl_wait(1.2f)，暂停1.2秒
// [register]
function mjl_wait(sec) {  
  return new Promise(resolve => {  
      setTimeout(() => {  
          resolve();  
      }, sec*1000);  
  });  
}  


// //物品是否获得，例：mjl_isItemGet("ba_gua_jing", true)
// //"ba_gua_jing"：是否获得了八卦镜
// //true：如果没有获得，那么获得它，并且记录，如果是false：就单纯查询是否获得
// [register]
// bool mjl_isItemGet(char* item_name, bool ifNotGet_Get);

// //添加物品到背包，mjl_addItem("ba_gua_jing", 1)，表示添加一个八卦镜
// [register]
// void mjl_addItem(char* item_name, int cnt);

// //从背包里删除一个物品
// [register]
// void mjl_delItem(char* item_name, int cnt);

// //增加金钱
// [register]
// void mjl_addMoney(int cnt);

// //设置金钱
// [register]
// void mjl_setMoney(int cnt);

// //获取现有金钱数目
// [register]
// int mjl_getMoney();

// //根据id获得角色法术名字,例：mjl_getMagicNameByID("liu_qing_feng", 0)
// /*遍历角色所有法术
// 	int cnt = mjl_getMagicCount(hero);
// 	int i = 0;
// 	for ( i = 0; i < cnt; i++)
// 	{
// 		mjl_msg(mjl_getMagicNameByID(hero, i), 1.2f);
// 		mjl_wait(1.2f);
// 	}
// */
// [register]
// char* mjl_getMagicNameByID(char* hero_name, int id);
// //获得角色法术数量,例：mjl_getMagicCount("liu_qing_feng")
// [register]
// int mjl_getMagicCount(char* hero_name);
// //判断角色法术是否存在,例：mjl_isMagicExist("liu_qing_feng","fei_jian_zhan")
// [register]
// bool mjl_isMagicGet(char* hero_name, char* magic_name);
// //为角色添加一个法术,例：mjl_addMagic("liu_qing_feng","fei_jian_zhan")
// [register]
// void mjl_addMagic(char* hero_name, char* magic_name);

// //删除角色一个法术,例：mjl_delMagic(mjl_getMainHero(), "pei_yuan_shu");
// [register]
// bool mjl_delMagic(char* hero_name, char* magic_name);

// //在战斗中动态设置一个角色的特点法术是否可用，此函数仅在战斗中起效，非战斗状态无效
// [register]
// void mjl_setMagicEnableInFighting(char* hero_name, char* magic_name, bool enable);
// //在战斗中判断一个角色的特点法术是否可用，此函数仅在战斗中起效，非战斗状态无效
// [register]
// bool mjl_isMagicEnableInFighting(char* hero_name, char* magic_name);

// //删除角色所有法术
// [register]
// bool mjl_delAllMagic(char* hero_name);

// //查询一个标志，防止重复执行一些代码
// //关于参数：ifNotGet_Get
// //true：查询标志是否设置，如果设置了，返回结果true；如果没有设置，就设置他，返回结果false
// //false：查询标志是否设置，如果设置了，返回true；如果没有，返回false
// //例：mjl_isFlagGet("chi_fan", true)，chi_fan这个标志设置了么，true表示如果没有设置标志，就设置为true
// [register]
function mjl_isFlagGet(name, ifNotGet_Get){
  let flag = databus.gameStatus[name]
  if(ifNotGet_Get){
    databus.gameStatus[name]=true
  }
  // console.log(databus.gameStatus['fu_mo_jian_mission_start'])
  return flag
}
// //查询一个标志是否设置
// [register]
// bool mjl_isFlag(char* name);
// //设置一个标记的状态
// [register]
function mjl_setFlag(name, ifNotGet_Get){
  return new Promise(resolve => {  
    setTimeout(() => {  
      databus.gameStatus[name]=ifNotGet_Get
    }, 1);  
  });  
  
}

// //删除一个标记，如果成功返回true，否则返回false
// [register]
// bool mjl_delFlag(char* name);

// //删除所有标记
// [register]
// void mjl_delAllFlag();

// //获得当前存档标记的总数，包括设置为true或者false的
// [register]
// int mjl_getFlagCount();

// //根据id获取对应标记的名称，如果id非法，返回""，使用样例：
// /*
// int i = 0;
// int cnt = mjl_getFlagCount();
// char* name;
// for (i = 0; i < cnt; i++)
// {
// 	name = mjl_getFlagNameByID(i);
// 	if (mjl_matchStr(name, "xxx"))
// 	{
// 		//do ....
// 	}
// }
// */
// [register]
// char* mjl_getFlagNameByID(int id);

// //角色是否装备某件装备
// [register]
// bool mjl_isEquiped(char* name, char* item_name);

// //获得背包里某个物品的数量
// [register]
// int mjl_getItemCount(char* item_name);

// //设置地图的随机野怪配置
// [register]
function mjl_setFightConfig(mapName){
  console.log(mapName)
}

// //设置战斗背景
// [register]
// void mjl_setFightBg(char* fight_bg);

// //设置地图某个位置是否物理阻隔
// [register]
// void mjl_setPhy(char* id, bool bPhy);

// //打开购买界面，用于角色在药店、武器店购买物品
// [register]
// void mjl_openBuy(char* config);

// //打开当铺
// [register]
// bool mjl_openSell();//没有物品返回false

// //判断所有角色是否状态全满
// [register]
// bool mjl_isStatePerfect(bool bRestore);

// //与boss战斗，例mjl_fight("hu_deng_shou,hu_jian_shen,hu_deng_shou", true);
// //与护灯兽、护剑神、护灯兽战斗，true表示失败后gameover，false则不会
// [register]
// void mjl_fight(char* enemy_array, bool bDead);

// //与mjl_fight功能类似，增加的power可以调整本次战斗的所有敌人的hp、mp、atk、dfd、body、mana、luck参数，不影响敌人等级、奖励的经验、金钱、物品掉落概率等
// //power为1.0f表示正常难度
// //power为0.9f，表示敌人参数为正常的90%，其他情况类似，数字必须加f，否则结果不可控
// [register]
// void mjl_fightWithPower(char* enemy_array, float power, bool bDead);

// //战斗是否失败了
// [register]
// bool mjl_isFightLose();//return 1:win;0:lose

// //为物品设置缩放
// [register]
// void mjl_setScale(char* name, float x, float y);

// //播放一个动画，例：mjl_playAnim("t1", "deng", "pos_0", -1);
// //播放灯的动画
// [register]
// void mjl_playAnim(char* name, char* anim, char* pos, int ZOrder);//ZOrder<0±íÊ¾×Ô¶¯¸üÐÂ

// //停止动画
// [register]
// void mjl_stopAnim(char* name);

// //继续动画
// [register]
// void mjl_resumeAnim(char* name);

// //播放一个特效，例：mjl_playSpe("t","di_dong_shan_yao", "pos_2", false, false);
// //播放地动山摇特效，bLoop：表示是否循环播放，isPosNameObj：表示pos_name代表的是地图的位置还是某个物品的位置
// [register]
// void mjl_playSpe(char* name, char* spe, char* pos_name, bool bLoop, bool isPosNameObj);

// //设置物品是否可见
// [register] 
// void mjl_setVisible(char* name, bool v);

// //设置state物品的开关，比如门、宝箱
// [register]
// void mjl_setOpen(char* name, bool v);

// //state物品是否处于打开的状态
// [register]
// bool mjl_isOpen(char* name);

// //设置主角色，就是操控的角色，例：mjl_setMainHero("mu_rong_xiao_mei")，把慕容小梅设置为当前操控角色
// //注意，使用全新角色是，要先调用mjl_setHeroActive("mu_rong_xiao_mei", true)，加载这个角色，否则会报错
// [register]
// void mjl_setMainHero(char* name);

// //设置一个主角是否在队伍中
// [register]
// void mjl_setHeroActive(char* name, bool v);

// //判断角色是否在队伍中，如果非active，则不参与战斗、形象展示
// [register]
// bool mjl_isHeroActive(char* name);

// //设置是否在地图上显示队伍列表npc形象，仅显示已active的角色的npc形象
// //设置为true，会导致现有已显示的队列npc形象重置，包括其位置、朝向等信息
// //设置为false，清空地图上显示的队伍npc
// //如果连续设置多次同样参数，会被忽略
// [register]
// void mjl_setShowHeroNPCQueue(bool v);

// //判断是否在地图上显示队伍列表npc形象
// [register]
// bool mjl_isShowHeroNPCQueue();

// //重置角色npc形象，如果当前是队伍列表npc形象，则位置、朝向统一与主角一致
// [register]
// void mjl_restructHero();

// //获取当前队伍中激活的角色的数量
// [register]
// int mjl_getHeroActiveCount();

// //弹出选择对话框,例：int i = mjl_select("购买,取消", true)
// //i为0，表示选择[购买]，为1表示选择[取消]
// //bEsc：表示按esc键是否隐藏选择对话框
// [register]
// int mjl_select(char* item, bool bEsc);

// //获得一个0~1直接的随机数
// [register]
// float mjl_rand0_1();

// //切场，例：mjl_qieChang("第二天")
// [register]
// void mjl_qieChang(char* msg);

// //结束游戏，bFinish：是否播放结束动画
// [register]
// void mjl_gameOver(bool bFinish);

// //清理无用的图片缓存
// [register]
// void mjl_clearTextureCache();

// //获取当前难度等级,0:难度1,1:难度2,2:难度3
// [register]
// int mjl_getDifficultID();

// //获得当前难度等级下，通关次数
// [register]
// int mjl_getPlayOverCount(int difficult_id);

// //设定摄像机跟随
// [register]
// void mjl_setCamFocus(char* name, bool bImmediately);

// //显示一个学习法术的面板，只用于显示，不能真正为角色添加法术
// //hero_name:角色名字，如：柳清风
// //magic_name:法术名字，如：飞剑斩
// //dt:显示持续时间
// [register]
// void mjl_showMagicLearn(char* hero_name, char* magic_name, float dt);

// //左上角的角色坐标是否显示
// [register]
// bool mjl_isEnableShowCoordinate();

// //设置左上角的角色坐标是否显示，true表示显示，false不显示
// //只需设置一次即可，不用每张地图都设置，此功能全局有效
// [register]
// void mjl_setEnableShowCoordinate(bool v);

// //判断是否允许保存存档
// [register]
// bool mjl_isEnableSave();

// //设置是否允许保存存档
// [register]
// void mjl_setEnableSave(bool v);

// //播放bgm，仅支持ogg，建议44100kHz+双通道+每通道8位
// //bgm_path：bgm路径
// //bLoop表示是否循环播放
// //例：mjl_playBGM("audio/bgm/bgm.ogg", true)
// [register]
// void mjl_playBGM(char* bgm_path, bool bLoop);

// //停止bgm
// //bgm_path：bgm路径
// [register]
// void mjl_stopBGM(char* bgm_path);

// //用于累积数值，比如好感度
// //name:一个自定义的名字，比如:hao_gan；
// //v：一个整数，比如代表好感度
// //举例：
// //char* my_flag = "hao_gan";
// //int v = mjl_getNameInt(my_flag);
// //mjl_setNameInt(my_flag, v + 1);
// [register]
// bool mjl_setNameInt(char* name, int v);
// [register]
// int mjl_getNameInt(char* name);

// ////用于累积浮点数的数值，比如时间
// //name:一个自定义的名字，比如:cur_time；
// //v：一个浮点数，即小数，比如代表时间
// //举例：
// //char* my_flag = "hao_gan";
// //float v = mjl_getNameFloat(my_flag);
// //mjl_setNameFloat(my_flag, v + 1.0f);
// [register]
// bool mjl_setNameFloat(char* name, float v);
// [register]
// float mjl_getNameFloat(char* name);


// //获得角色穿戴物品的名字
// //hero_name:角色名字，如:liu_qing_feng
// //type:穿戴类型，如HERO_DRESS_zhuang_shi_1
// [register]
// char* mjl_getHeroEquipment(char* hero_name, HERO_DRESS_ITEM type);

// //设置角色穿戴
// //hero_name:角色名字，如:liu_qing_feng
// //type:穿戴类型，如HERO_DRESS_zhuang_shi_1
// //equipment_name:穿戴物品的名字，如"ping_an_fu"
// //如果物品设置成功，返回true，否则false
// //失败可能的原因：物品不存在；物品的类型与穿戴要求的类型不匹配
// [register]
// bool mjl_setHeroEquipment(char* hero_name, HERO_DRESS_ITEM type, char* equipment_name);

// //从背包中拿出一件装备，设置给角色，背包中物品数量-1
// bool mjl_loadHeroEquipment(char* hero_name, HERO_DRESS_ITEM type, char* equipment_name)
// {
// 	if (mjl_matchStr(equipment_name, ""))
// 	{
// 		return false;
// 	}
// 	int num = mjl_getItemCount(equipment_name);
// 	char* log;
// 	if (num <= 0)
// 	{
// 		//说明背包里没有这个装备物品
// 		log = mjl_mergeStr(equipment_name, " not exist in bag");
// 		mjl_log(log);
// 		return false;
// 	}
// 	if (mjl_setHeroEquipment(hero_name, type, equipment_name))
// 	{
// 		mjl_delItem(equipment_name, 1);
// 		return true;
// 	}
// 	return false;
// }
// //卸载角色装备，并将装备放回背包
// bool mjl_unloadHeroEquipment(char* hero_name, HERO_DRESS_ITEM type)
// {
// 	char* item_name = mjl_getHeroEquipment(hero_name, type);
// 	if (mjl_matchStr(item_name, ""))
// 	{
// 		//说明装备为空，直接返回
// 		return true;
// 	}
// 	if (mjl_setHeroEquipment(hero_name, type, ""))
// 	{
// 		mjl_addItem(item_name, 1);
// 		return true;
// 	}
// 	return false;
// }

module.exports = {
  mjl_isFlagGet: mjl_isFlagGet,
  mjl_setFlag: mjl_setFlag,
  mjl_setFightConfig: mjl_setFightConfig,
  mjl_msgMap: mjl_msgMap,
  mjl_runScript: mjl_runScript,
  mjl_getHeroNpc: mjl_getHeroNpc,
  mjl_getMainHero: mjl_getMainHero,
  mjl_say: mjl_say,
  mjl_showTex: mjl_showTex,
  mjl_wait: mjl_wait,
  mjl_loadMap: mjl_loadMap,
  mjl_setPos: mjl_setPos,
  mjl_loadNpc: mjl_loadNpc,
  mjl_destroy: mjl_destroy
};